// mongoose 是一个用于连接和操作 MongoDB 数据库的库
const mongoose = require('mongoose');
// bcrypt 是一个用于密码加密的库，用于将密码加密为哈希值，以提高安全性
const bcrypt = require('bcryptjs');

// 定义用户模型架构
const userSchema = new mongoose.Schema({
  username: {
    type: String, // 字符串类型
    required: true, // 必填字段
    unique: true, // 唯一值
    trim: true // 去除字符串两端的空白字符
  },
  email: {
    type: String,
    required: true,
    unique: true,
    trim: true,
    lowercase: true // 小写化
  },
  password: {
    type: String,
    required: true
  },
  role: {
    type: String,
    enum: ['user', 'admin'], // 枚举类型
    default: 'user' // 默认值
  }
}, {
  timestamps: true // 自动添加创建和更新时间戳
});

// 密码加密中间件 - 在保存用户前自动加密密码
userSchema.pre('save', async function(next) {
  // 如果密码没有被修改，则跳过加密
  if (!this.isModified('password')) return next();
  // 生成盐值
  const salt = await bcrypt.genSalt(10);
  // 加密密码
  this.password = await bcrypt.hash(this.password, salt);
});

// 验证密码方法 - 用于登录时验证密码
userSchema.methods.matchPassword = async function(enteredPassword) {
  return await bcrypt.compare(enteredPassword, this.password);
};

// 创建并导出用户模型
const User = mongoose.model('User', userSchema);
module.exports = User;
